{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 训练一个分类器\n",
    "\n",
    "训练流程如下：\n",
    "1. 采用 `torchvision` 加载和归一化 CIFAR10 训练集和测试集数据；\n",
    "2. 定义一个卷积神经网络\n",
    "3. 定义损失函数\n",
    "4. 在训练集上训练\n",
    "5. 在测试集上测试模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1. 加载并归一化 CIFAR10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "# 将图片数据从 [0,1] 归一化为 [-1, 1] 的取值范围\n",
    "\n",
    "\n",
    "transform=transforms.Compose(\n",
    "    [transforms.ToTensor(),\n",
    "     transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])\n",
    "\n",
    "trainset=torchvision.datasets.CIFAR10(root='./data',train=True,\n",
    "                                      download=True,transform=transform)\n",
    "trainloader=torch.utils.data.DataLoader(trainset,batch_size=4,\n",
    "                                        shuffle=True,num_workers=2)\n",
    "\n",
    "testset=torchvision.datasets.CIFAR10(root='./data',train=False,\n",
    "                                     download=True,transform=transform)\n",
    "testloader=torch.utils.data.DataLoader(testset,batch_size=4,\n",
    "                                        shuffle=False,num_workers=2)\n",
    "\n",
    "classes=('plane','car','bird','cat',\n",
    "         'deer','dog','frog','horse','ship','truck')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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vGBuvPFGE41GzYEDB97urjWVP/mTPzEPPPCAef75583OnTvNlVdeaZYuXWoymUztM3fffbeJx+PmBz/4gdm1a5f51Kc+ZXp7e006nX4be958nn76aTM4OGjOOussc+ONN9b+vpjHZ3p62ixbtsx84QtfML///e/N8PCw+fnPf25eeeWV2mcW8/jceeedpr293fz0pz81w8PD5t///d9NLBYz9957b+0zi2l8fvazn5k77rjD/OAHPzBEZH74wx9C+/GMxXXXXWeWLFlitm7dav74xz+a97///ebss882lUqlyVdz8mk0PqlUynzoQx8y3//+981LL71kfvvb35qNGzea9evXwzHezeOzUN6RLx/vec97zHXXXQd/W716tbntttveph69MxgfHzdEZLZt22aMMcZ1XdPT02Puvvvu2mcKhYJJJpPmn//5n9+ubjadubk5s3LlSrN161Zz6aWX1l4+Fvv43Hrrrebiiy+et32xj8+VV15p/uIv/gL+dvXVV5vPfvazxpjFPT7yx/V4xiKVShm/328eeeSR2mcOHz5sPB6Peeyxx5rW92ZwrJczydNPP22IqPaf5sU0PsfDO052KZVKtH37dtq0aRP8fdOmTfTUU0+9Tb16ZzA7O0tERG1tbURENDw8TGNjYzBWwWCQLr300kU1Vl/+8pfpyiuvpA996EPw98U+Pj/5yU9ow4YN9Gd/9mfU1dVF5557Ln3nO9+ptS/28bn44ovpF7/4Bb388stERPTss8/Sk08+SR/+8IeJSMfH5njGYvv27VQul+EzfX19tG7dukU3XkSvrdeO41BLSwsR6fhI3nFZbScnJ6larVJ3dzf8vbu7m8bGxt6mXr39GGPo5ptvposvvpjWrVtHRFQbj2ON1YEDB5rex7eDRx55hLZv307PPPNMXdtiH599+/bR/fffTzfffDN97Wtfo6effpr++q//moLBIH3+859f9ONz66230uzsLK1evZq8Xi9Vq1X65je/SZ/5zGeISOePzfGMxdjYGAUCAWptba37zGJbuwuFAt122210zTXX1LLa6vgg77iXj9dxHAfqxpi6vy0mbrjhBnruuefoySefrGtbrGM1MjJCN954Iz3++OMUCoXm/dxiHR/XdWnDhg101113ERHRueeeS7t376b777+fPv/5z9c+t1jH5/vf/z5973vfo4cffpjOOOMM2rlzJ910003U19dH1157be1zi3V8jsWJjMViG69yuUyf/vSnyXVduu+++97w84ttfF7nHSe7dHR0kNfrrXsTHB8fr3vrXix85StfoZ/85Cf0y1/+kvr7+2t/7+npISJatGO1fft2Gh8fp/Xr15PP5yOfz0fbtm2jf/zHfySfz1cbg8U6Pr29vbR27Vr425o1a+jgwYNEpPPnb/7mb+i2226jT3/603TmmWfS5z73OfrqV79KW7ZsISIdH5vjGYuenh4qlUo0MzMz72fe7ZTLZfrkJz9Jw8PDtHXr1tquB5GOj+Qd9/IRCARo/fr1tHXrVvj71q1b6cILL3ybevX2YIyhG264gR599FF64oknaGhoCNqHhoaop6cHxqpUKtG2bdsWxVh98IMfpF27dtHOnTtr/zZs2EB//ud/Tjt37qTly5cv6vG56KKL6lyzX375ZVq2bBkR6fzJ5XLk8eAS6PV6a662i318bI5nLNavX09+vx8+Mzo6Ss8///yiGK/XXzz27t1LP//5z6m9vR3aF/v41PF2Wbo24nVX2+9+97vmhRdeMDfddJOJRqNm//79b3fXmspf/dVfmWQyaX71q1+Z0dHR2r9cLlf7zN13322SyaR59NFHza5du8xnPvOZd60r4PFge7sYs7jH5+mnnzY+n89885vfNHv37jX/9m//ZiKRiPne975X+8xiHp9rr73WLFmypOZq++ijj5qOjg5zyy231D6zmMZnbm7O7Nixw+zYscMQkbnnnnvMjh07at4axzMW1113nenv7zc///nPzR//+EfzgQ984F3jStpofMrlsvnYxz5m+vv7zc6dO2G9LhaLtWO8m8dnobwjXz6MMeaf/umfzLJly0wgEDDnnXdezb10MUFEx/z3wAMP1D7juq75+te/bnp6ekwwGDSXXHKJ2bVr19vX6bcZ+fKx2MfnP/7jP8y6detMMBg0q1evNt/+9rehfTGPTzqdNjfeeKNZunSpCYVCZvny5eaOO+6AH4vFND6//OUvj7neXHvttcaY4xuLfD5vbrjhBtPW1mbC4bD5yEc+Yg4ePPg2XM3Jp9H4DA8Pz7te//KXv6wd4908PgvFMcaY5u2zKIqiKIqy2HnH2XwoiqIoivLuRl8+FEVRFEVpKvryoSiKoihKU9GXD0VRFEVRmoq+fCiKoiiK0lT05UNRFEVRlKaiLx+KoiiKojQVfflQFEVRFKWp6MuHoiiKoihNRV8+FEVRFEVpKvryoSiKoihKU/n/AFPhWVWsReioAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " frogplane bird  dog\n"
     ]
    }
   ],
   "source": [
    "# 展示数据集图片\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "#展示图片的函数\n",
    "def imshow(img):\n",
    "    img=img/2+0.5\n",
    "    npimg=img.numpy()\n",
    "    plt.imshow(np.transpose(npimg,(1,2,0)))\n",
    "    plt.show()\n",
    "    \n",
    "#随机获取训练集图片\n",
    "dataiter=iter(trainloader)\n",
    "images,labels=next(dataiter)\n",
    "\n",
    "#展示图片\n",
    "imshow(torchvision.utils.make_grid(images))\n",
    "#打印图片类别标签\n",
    "print(''.join('%5s'% classes[labels[j]] for j in range(4)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2. 定义一个卷积神经网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net,self).__init__()\n",
    "        self.conv1=nn.Conv2d(3,6,5)\n",
    "        self.pool=nn.MaxPool2d(2,2)\n",
    "        self.conv2=nn.Conv2d(6,16,5)\n",
    "        self.fc1=nn.Linear(16*5*5,120)\n",
    "        self.fc2=nn.Linear(120,84)\n",
    "        self.fc3=nn.Linear(84,10)\n",
    "\n",
    "    def forward(self,x):\n",
    "        x=self.pool(F.relu(self.conv1(x)))\n",
    "        x=self.pool(F.relu(self.conv2(x)))\n",
    "        x=x.view(-1,16*5*5)\n",
    "        x=F.relu(self.fc1(x))\n",
    "        x=F.relu(self.fc2(x))\n",
    "        x=self.fc3(x)\n",
    "        return x\n",
    "net=Net()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3. 定义损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch.optim as optim\n",
    "criterion=nn.CrossEntropyLoss()\n",
    "optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.9)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 4. 训练网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 2000] loss:1.237\n",
      "[1, 4000] loss:1.213\n",
      "[1, 6000] loss:1.196\n",
      "[1, 8000] loss:1.198\n",
      "[1,10000] loss:1.185\n",
      "[1,12000] loss:1.171\n",
      "[2, 2000] loss:1.100\n",
      "[2, 4000] loss:1.131\n",
      "[2, 6000] loss:1.094\n",
      "[2, 8000] loss:1.125\n",
      "[2,10000] loss:1.102\n",
      "[2,12000] loss:1.108\n",
      "Finished Training!Total cost time: 57.06033515930176\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "start=time.time()\n",
    "for epoch in range(2):\n",
    "    running_loss=0.0\n",
    "    for i ,data in enumerate(trainloader,0):\n",
    "        inputs,labels=data\n",
    "\n",
    "        optimizer.zero_grad()\n",
    "        outputs=net(inputs)\n",
    "        loss=criterion(outputs,labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "        running_loss+=loss.item()\n",
    "        if i%2000==1999:\n",
    "            print('[%d,%5d] loss:%.3f'%(epoch+1,i+1,running_loss/2000))\n",
    "            running_loss=0.0\n",
    "print('Finished Training!Total cost time:',time.time()-start)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5. 测试模型效果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GroundTruth:   cat ship shipplane\n"
     ]
    }
   ],
   "source": [
    "dataiter=iter(testloader)\n",
    "images,labels=next(dataiter)\n",
    "\n",
    "#打印图片\n",
    "imshow(torchvision.utils.make_grid(images))\n",
    "print('GroundTruth:',''.join('%5s' % classes[labels[j]] for j in range(4)))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "outputs: tensor([[-1.2631, -1.3607,  0.2846,  2.5049, -0.6884,  1.1553,  0.3367,  0.1592,\n",
      "         -0.1327, -0.7980],\n",
      "        [ 3.6983,  6.7485, -2.0817, -2.9290, -5.8036, -5.4213, -3.0845, -5.1103,\n",
      "          7.5326,  4.0854],\n",
      "        [ 2.0002,  3.1806, -0.6705, -1.8057, -2.2309, -2.6693, -2.9799, -1.5604,\n",
      "          2.9093,  2.0111],\n",
      "        [ 2.3881,  2.4290,  0.0513, -1.6883, -2.0757, -2.5205, -2.8703, -0.6579,\n",
      "          3.2469,  0.7514]], grad_fn=<AddmmBackward0>)\n",
      "predict: torch.return_types.max(\n",
      "values=tensor([2.5049, 7.5326, 3.1806, 3.2469], grad_fn=<MaxBackward0>),\n",
      "indices=tensor([3, 8, 1, 8]))\n",
      "Predict:   cat ship  car ship\n"
     ]
    }
   ],
   "source": [
    "# 网络输出\n",
    "#网络输出\n",
    "outputs=net(images)\n",
    "print('outputs:',outputs)\n",
    "#预测结果\n",
    "print('predict:',torch.max(outputs,1))\n",
    "_,predicted=torch.max(outputs,1)\n",
    "print('Predict:',''.join('%5s' % classes[predicted[j]] for j in range(4)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对整个测试集进行测试，并计算准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy of the network on the 10000 test images: 59 %\n"
     ]
    }
   ],
   "source": [
    "correct=0\n",
    "total=0\n",
    "with torch.no_grad():\n",
    "    for data in testloader:\n",
    "        images,labels=data\n",
    "        outputs=net(images)\n",
    "        _,predicted=torch.max(outputs.data,1)\n",
    "        total+=labels.size(0)\n",
    "        correct+=(predicted==labels).sum().item()\n",
    "\n",
    "print('Accuracy of the network on the 10000 test images: %d %%'%(100*correct/total))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来看看各个类别的准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy of plane: 54 %\n",
      "Accuracy of   car: 79 %\n",
      "Accuracy of  bird: 42 %\n",
      "Accuracy of   cat: 37 %\n",
      "Accuracy of  deer: 53 %\n",
      "Accuracy of   dog: 49 %\n",
      "Accuracy of  frog: 80 %\n",
      "Accuracy of horse: 61 %\n",
      "Accuracy of  ship: 78 %\n",
      "Accuracy of truck: 61 %\n"
     ]
    }
   ],
   "source": [
    "class_correct=list(0.for i in range(10))\n",
    "class_total=list(0.for i in range(10))\n",
    "with torch.no_grad():\n",
    "    for data in testloader:\n",
    "        images,labels=data\n",
    "        outputs=net(images)\n",
    "        _,predicted=torch.max(outputs,1)\n",
    "        c=(predicted==labels).squeeze()\n",
    "        for i in range(4):\n",
    "            label=labels[i]\n",
    "            class_correct[label]+=c[i].item()\n",
    "            class_total[label]+=1\n",
    "for i in range(10):\n",
    "    print('Accuracy of %5s: %2d %%'%(classes[i],100*class_correct[i] / class_total[i]))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 在 GPU 上训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cuda:0\n"
     ]
    }
   ],
   "source": [
    "device=torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "print(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1,  2000] loss: 1.058\n",
      "[1,  4000] loss: 1.030\n",
      "[1,  6000] loss: 1.052\n",
      "[1,  8000] loss: 1.050\n",
      "[1, 10000] loss: 1.053\n",
      "[1, 12000] loss: 1.046\n",
      "[2,  2000] loss: 0.977\n",
      "[2,  4000] loss: 0.984\n",
      "[2,  6000] loss: 0.990\n",
      "[2,  8000] loss: 0.994\n",
      "[2, 10000] loss: 1.019\n",
      "[2, 12000] loss: 1.003\n",
      "Finished Training! Total cost time:  58.75479769706726\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "# 在 GPU 上训练注意需要将网络和数据放到 GPU 上\n",
    "net.to(device)\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)\n",
    "\n",
    "start = time.time()\n",
    "for epoch in range(2):\n",
    "    \n",
    "    running_loss = 0.0\n",
    "    for i, data in enumerate(trainloader, 0):\n",
    "        # 获取输入数据\n",
    "        inputs, labels = data\n",
    "        inputs, labels = inputs.to(device), labels.to(device)\n",
    "        # 清空梯度缓存\n",
    "        optimizer.zero_grad()\n",
    "        \n",
    "        outputs = net(inputs)\n",
    "        loss = criterion(outputs, labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        \n",
    "        # 打印统计信息\n",
    "        running_loss += loss.item()\n",
    "        if i % 2000 == 1999:\n",
    "            # 每 2000 次迭代打印一次信息\n",
    "            print('[%d, %5d] loss: %.3f' % (epoch + 1, i+1, running_loss / 2000))\n",
    "            running_loss = 0.0\n",
    "print('Finished Training! Total cost time: ', time.time() - start)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
